package sifeap.pl.util.solicitudes;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import sifeap.bl.ejb.gestionarchivos.GestionArchivosBLLocal;
import sifeap.entities.gestionarchivos.valueobject.GestionArchivoVO;
import sifeap.entities.soportes.Soporte;
import sifeap.entities.soportes.TipoSoporte;
import sifeap.exception.SifeapException;
import sifeap.pl.util.FacesUtils;

/**
 * Clase que implementa los metodos comunes para las solicitudes de credito y solicitud
 * @author Jorge
 *
 */
public class SolicitudesBase {
	public File archivoSeleccionado;
	public InputStream stream;
	public StreamedContent mostrarArchivo;
	
	private boolean mostrarAdvertencia;

	private int accion;
	
	@EJB
	public GestionArchivosBLLocal gestionArchivosBL;

	public final String MENSAJES_BUNDLE = "sifeap.pl.bundles.mensajes";

	public File getArchivoSeleccionado() {
		return archivoSeleccionado;
	}

	public void setArchivoSeleccionado(File archivoSeleccionado) {
		this.archivoSeleccionado = archivoSeleccionado;
	}
	
	
	public void setMostrarArchivo(StreamedContent mostrarArchivo) {
		this.mostrarArchivo = mostrarArchivo;
	}
	
	public StreamedContent getMostrarArchivo() {
		if (getArchivoSeleccionado() != null) {
			cerrarStream();

			try {
				GestionArchivoVO gestionArchivoVo = gestionArchivosBL.obtenerArchivo(getArchivoSeleccionado().getName(), GestionArchivoVO.PARAMETRO_UBICACION_SOLICITUDES_CREDITO);
				stream = gestionArchivoVo.getInputStream();
				
				mostrarArchivo = new DefaultStreamedContent(stream, gestionArchivoVo.getContentType(), gestionArchivoVo.getNombreArchivo());
			} catch (Exception e) {
				try {
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.solicitudcredito.mostrararchivo.error"), false);
				} catch (Exception e1) {}
				e.printStackTrace();
			}
		}
		return mostrarArchivo;
	}
	
	public int getAccion() {
		return accion;
	}

	public void setAccion(int accion) {
		this.accion = accion;
	}
	
	public boolean isMostrarAdvertencia() {
		return mostrarAdvertencia;
	}
	
	public void setMostrarAdvertencia(boolean mostrarAdvertencia) {
		this.mostrarAdvertencia = mostrarAdvertencia;
	}
	
	
	public void cerrarStream() {
		if (stream != null) {
			try {
				stream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public File guardarArchivo(FileUploadEvent event) throws SifeapException, IOException {
		UploadedFile archivoSubido = event.getFile();
		File archivo = new File(archivoSubido.getFileName());
		String nombreArchivo = archivo.getName();
		archivo = gestionArchivosBL.guardarArchivo(nombreArchivo, archivoSubido.getInputstream(), GestionArchivoVO.PARAMETRO_UBICACION_SOLICITUDES_CREDITO);
		return archivo;
	}
	
	public boolean eliminarArchivo() throws SifeapException {
		boolean eliminado = false;

		if (stream != null) {
			try {
				stream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		if (getArchivoSeleccionado() != null) {
				//Elimina el archivo
				eliminado = gestionArchivosBL.eliminarArchivo(getArchivoSeleccionado().getName(), GestionArchivoVO.PARAMETRO_UBICACION_SOLICITUDES_CREDITO);
		}

		return eliminado;
	}
	
	public List<Soporte> obtenerListaSoportes(List<File> listaArchivos, Long idTipoSoporte, List<Soporte> listaSoportesOrigen) {
		List<Soporte> listaSoportes = listaSoportesOrigen;
		
		if (listaArchivos != null && !listaArchivos.isEmpty()) {
			if (listaSoportes == null) {
				listaSoportes = new ArrayList<Soporte>();
			}
			
			Soporte soporte;
			TipoSoporte tipoSoporte = new TipoSoporte();
			tipoSoporte.setIdTipoSoporte(idTipoSoporte);
			
			for (File archivoTemp : listaArchivos) {
				soporte = new Soporte();
				soporte.setTipossoporte(tipoSoporte);
				soporte.setFechaRegistro(new Date());
				soporte.setNombreArchivo(archivoTemp.getName());
				listaSoportes.add(soporte);
			}
		}
		return listaSoportes;
	}
}